﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PlanInterfejs
{
    public partial class GodzinyControl : UserControl
    {
        PlanView _view;

        public PlanView View
        {
            get { return _view; }
            set { _view = value; }
        }
        public GodzinyControl()
        {
            InitializeComponent();
        }

        void SetHoursLabels()
        {
            int godzina = 7;
            int minuta = 55;
            for (int i = 1; i <= 11; i++)
            {
                ComboBox actual;
                actual = ((ComboBox)Controls.Find("comboBox" + i, true).First());
                if (actual == null || actual.SelectedItem == null) break;
                int przerwa = int.Parse(((string)actual.SelectedItem).Split(new char[] { ' ' }).First());
                Label actTB;
                actTB = ((Label)Controls.Find("lbl" + i, true).First());

                minuta += przerwa;
                while (minuta >= 60)
                {
                    minuta -= 60;
                    godzina++;
                }

                actTB.Text = godzina + ":" + minuta.ToString("D2") + " - ";
                minuta += 45;
                if (minuta >= 60)
                {
                    minuta -= 60;
                    godzina++;
                }
                actTB.Text += godzina + ":" + minuta.ToString("D2");

            }
            
        }

        void SaveToDB()
        {
            int ileLekcji = int.Parse((string)cbIle.SelectedItem);

            //musze zrobic tak jak ponizej. wtf? nie ma metody w stylu "RemoveAll"!
            //coraz mniej mi sie L2E podoba.
            //DAL.database.ExecuteStoreCommand("DELETE FROM Godziny_Zajec", null);

            //a jednak nawet tak nie moge zrobic. dlaczego? bo potem "ObjectContext" jest
            //w "inconsistent state". co za lipa. dodalem stored procedure do bazy zeby ominac
            //ten problem:
            //DAL.database.DeleteAllGodzinyZajecImported(); // (:D)
            //DAL.database.SaveChanges();

            //fuck! dalej inconsistent state. trzeba widocznie zrobic tak:
            var res = from p in DAL.database.Godziny_Zajec select p;
            foreach (Godziny_Zajec gz in res)
            {
                DAL.database.DeleteObject(gz);
            }
            DAL.database.SaveChanges();
            //no i teraz dziala. co prawda to rozwiazanie jest idiotyczne, bo najpierw musze... pobrac
            //z bazy cala tabele, zanim usune wszystkie wiersze. nastepnie wiersze usuwane sa po kolei.
            //l2e ssie po calosci.


            for (int i = 1; i <= ileLekcji; i++)
            {
                Label actTB;
                actTB = ((Label)Controls.Find("lbl" + i, true).First());
                string poczatekLekcji = actTB.Text.Split(new char[] {' ', '-'})[0];
                string koniecLekcji = actTB.Text.Split(new char[] {' ', '-'})[3];
                
                DAL.database.Godziny_Zajec.AddObject(Godziny_Zajec.CreateGodziny_Zajec(i, TimeSpan.Parse(poczatekLekcji), 
                    TimeSpan.Parse(koniecLekcji)));
            }

            DAL.database.SaveChanges();
        }

        void ReadFromDB()
        {
            List<Godziny_Zajec> gzList = (from p in DAL.database.Godziny_Zajec select p).ToList();
            if (gzList.Count < 2)
            {
                cbIle.SelectedIndex = 7;
                
                comboBox1.SelectedIndex = 0;
                comboBox5.SelectedIndex = 3;
                return;
            }
            int ileLekcji = gzList.Count;
            cbIle.SelectedIndex = ileLekcji - 2;

            gzList.Sort((gz1, gz2) => gz1.NumerPorzadkowy.CompareTo(gz2.NumerPorzadkowy));

            int przerwa;
            TimeSpan actH = TimeSpan.Parse("7:55");
            for (int i = 0; i < ileLekcji; i++)
            {
                przerwa = (gzList[i].Czas_Poczatek - actH).Minutes;
                ComboBox actual;
                actual = ((ComboBox)Controls.Find("comboBox" + (i+1), true).First());
                for (int j = 0; j < actual.Items.Count; j++)
                {
                    if (((string)actual.Items[j]).Split(new char[] { ' ' }).First() == przerwa.ToString())
                    {
                        actual.SelectedIndex = j;
                        break;
                    }
                }
                actH = gzList[i].Czas_Koniec;
            }
            

        }

        private void GodzinyControl_VisibleChanged(object sender, EventArgs e)
        {

        }

        void SetComboBoxesEnableState()
        {
            if (cbIle.SelectedItem == null) return;
            int ileLekcji = int.Parse((string)cbIle.SelectedItem);
            for (int i = 1; i <= 11; i++)
            {
                ComboBox actual;
                actual = ((ComboBox)Controls.Find("comboBox" + i, true).First());
                actual.Enabled = i < ileLekcji;
            }
        }

        private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            SetHoursLabels();
            button1.Enabled = true;
        }

        private void cbIle_SelectedIndexChanged(object sender, EventArgs e)
        {
            SetComboBoxesEnableState();
            button1.Enabled = true;
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            SaveToDB();
            button1.Enabled = false;
        }

        private void GodzinyControl_Load(object sender, EventArgs e)
        {
            for (int i = 1; i <= 11; i++)
            {
                ComboBox actual;
                actual = ((ComboBox)Controls.Find("comboBox" + i, true).First());
                actual.SelectedIndex = 1;
                
            }
            ReadFromDB();
            SetHoursLabels();
            SetComboBoxesEnableState();
            cbIle.SelectedIndexChanged += cbIle_SelectedIndexChanged;
            for (int i = 1; i <= 11; i++)
                ((ComboBox)Controls.Find("comboBox" + i, true).First()).SelectedIndexChanged += comboBox1_SelectedIndexChanged_1;      
        }

    }
}
